﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SistemaBastanteo.Persistencia;
using SistemaBastanteo.Dominio;
using NUnit.Framework;

namespace SistemaBastanteo.Pruebas
{
    public class Test06_Bastanteo
    {
        IBastanteoDAO bastanteoDAO= null;
        IClienteDAO clienteDAO = null;
        IRepresentanteDAO representanteDAO = null;
        ITipoEmpresaDAO tipoEmpresaDAO = null;
        ITipoDocumentoDAO tipoDocumentoDAO = null;
        IPoderDAO poderDAO = null;

        TipoEmpresa tipoEmpresaCreado = null;
        Cliente clienteCreado = null;
        Representante representanteCreadoA = null;
        Representante representanteCreadoB = null;
        TipoDocumento tipoDocumentoCreado = null;
        Poder poderCreado1 = null;
        Poder poderCreado2 = null;
        Bastanteo bastanteoSF = null;
        Bastanteo bastanteoEC = null;
        


        [TestFixtureSetUp]
        public void InicializarPruebas()
        {
            tipoEmpresaDAO = new Persistencia.NH.TipoEmpresaDAO(); // Instanciamos la implementación elegida (ADO o NHibernate)
            clienteDAO = new Persistencia.NH.ClienteDAO(); // Instanciamos la implementación elegida (ADO o NHibernate)
            tipoDocumentoDAO = new Persistencia.NH.TipoDocumentoDAO();
            representanteDAO = new Persistencia.NH.RepresentanteDAO();
            poderDAO = new Persistencia.NH.PoderDAO();
            bastanteoDAO = new Persistencia.ADO.BastanteoDAO();

            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
            {
                bastanteoDAO.Eliminar(bastanteo);
            }

            foreach (Representante representate in representanteDAO.ListarTodos())
                representanteDAO.Eliminar(representate);

            foreach (TipoDocumento tipoDocumento in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipoDocumento);

            foreach (Cliente cliente in clienteDAO.ListarTodos())
                clienteDAO.Eliminar(cliente);

            foreach (TipoEmpresa tipoEmpresa in tipoEmpresaDAO.ListarTodos())
                tipoEmpresaDAO.Eliminar(tipoEmpresa);

            foreach (Poder poder in poderDAO.ListarTodos())
                poderDAO.Eliminar(poder);
            

            tipoEmpresaCreado = tipoEmpresaDAO.Crear(new TipoEmpresa() 
            { 
                Abreviacion = "SAC" 
            });
            
            clienteCreado = clienteDAO.Crear(new Cliente() 
            {   
                Ruc="11020304052", 
                RazonSocial="Seguridad Rimac", 
                Inicio=new DateTime(2001,10,10), 
                Tipo=tipoEmpresaDAO.Obtener(tipoEmpresaCreado.Codigo), 
                Empleados=15 
            });

            tipoDocumentoCreado = tipoDocumentoDAO.Crear(new TipoDocumento() 
            { 
                Descripcion = "DNI" 
            });

            representanteCreadoA = representanteDAO.Crear(new Representante()
            {
                TipoDocumento = tipoDocumentoDAO.Obtener(tipoDocumentoCreado.Codigo),
                Documento = "41404714",
                Nombres = "Jenny Rosario",
                Apellidos = "Ponce Bravo",
                Cargo = "Supervisora", 
                Grupo = "A", 
                Cliente= clienteDAO.Obtener(clienteCreado.Codigo )
            });
            
            representanteCreadoB = representanteDAO.Crear(new Representante()
            {
                TipoDocumento = tipoDocumentoDAO.Obtener(tipoDocumentoCreado.Codigo),
                Documento = "07080772",
                Nombres = "Roller",
                Apellidos = "Bravo Gonzalez",
                Cargo = "Gerente",
                Grupo = "B",
                Cliente = clienteDAO.Obtener(clienteCreado.Codigo)
            });


            poderCreado1 = poderDAO.Crear(new Poder() 
            {
                CodigoCorto = "CHCO", 
                Descripcion="Cobro de cheque", 
                TipoProducto="Activo"
            });

            poderCreado2 = poderDAO.Crear(new Poder()
            {
                CodigoCorto = "EFRET",
                Descripcion = "Retiro de efectivo",
                TipoProducto = "Activo"
            });
            

        }

        [Test]
        public void Test1_BastanteoASolaFirma()
        {
            //1. Error en caso los datos ingresados para el bastanteo no sean correctos.
            Bastanteo bastanteoACrear = new Bastanteo();
            ICollection<Combinacion> combinaciones =new List<Combinacion>();
            
            bastanteoACrear.Cliente = clienteCreado ;
            bastanteoACrear.Poder = null;
            Assert.Catch<Exception>(delegate
            {
                bastanteoSF = bastanteoDAO.Generar(bastanteoACrear, combinaciones);
            });

            //2. Validar que se crea correctamente (sin error) el bastanteo
            bastanteoACrear.Poder = poderCreado1;
            bastanteoACrear.Grupo = representanteCreadoA.Grupo;
            bastanteoACrear.Importe = 1000;
            bastanteoACrear.TipoIntervencion = "A Sola Firma";
            bastanteoACrear.FechaLimite = new DateTime(2011, 12, 31);

            Assert.DoesNotThrow(delegate
            {
                bastanteoSF = bastanteoDAO.Generar(bastanteoACrear, combinaciones);
            });

            
            //3. Error en caso los datos sean duplicados
            Bastanteo bastanteoDUP = new Bastanteo();
            Bastanteo bastanteoNuevo = bastanteoDAO.ObtenerBastanteo(bastanteoSF.Cliente.Codigo, bastanteoSF.Grupo, bastanteoSF.Poder.Codigo );
            Assert.Catch<Exception>(delegate
            {
                bastanteoDUP = bastanteoDAO.Generar(bastanteoNuevo, combinaciones);
            });

        }

        [Test]
        public void Test2_BastanteoEnConjunto()
        {
            //1. Error en caso los datos ingresados para el bastanteo no sean correctos.
            Bastanteo bastanteoACrear = new Bastanteo();
            ICollection<Combinacion> combinaciones = new List<Combinacion>();

            bastanteoACrear.Cliente = clienteCreado;
            bastanteoACrear.Poder = null;
            Assert.Catch<Exception>(delegate
            {
                bastanteoEC = bastanteoDAO.Generar(bastanteoACrear, combinaciones);
            });

            //2. Validar que se crea correctamente (sin error) el bastanteo y combinaciones
            bastanteoACrear.Poder = poderCreado2;
            bastanteoACrear.Grupo = representanteCreadoB.Grupo;
            bastanteoACrear.Importe = 5000;
            bastanteoACrear.TipoIntervencion = "En Conjunto Con";
            bastanteoACrear.FechaLimite = new DateTime(2011, 11, 30);

            combinaciones.Add(new Combinacion() { Cliente = bastanteoACrear.Cliente, Grupo = bastanteoACrear, Poder = bastanteoACrear.Poder, GrupoConjunto = representanteCreadoA.Grupo });

            Assert.DoesNotThrow(delegate
            {
                bastanteoEC = bastanteoDAO.Generar(bastanteoACrear, combinaciones);
            });

        }


        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            
            foreach (Bastanteo bastanteo in bastanteoDAO.ListarTodos())
            {
                bastanteoDAO.Eliminar(bastanteo);
            }

            foreach (Representante representate in representanteDAO.ListarTodos())
                representanteDAO.Eliminar(representate);

            foreach (TipoDocumento tipoDocumento in tipoDocumentoDAO.ListarTodos())
                tipoDocumentoDAO.Eliminar(tipoDocumento);

            foreach (Cliente cliente in clienteDAO.ListarTodos())
                clienteDAO.Eliminar(cliente);

            foreach (TipoEmpresa tipoEmpresa in tipoEmpresaDAO.ListarTodos())
                tipoEmpresaDAO.Eliminar(tipoEmpresa);

            foreach (Poder poder in poderDAO.ListarTodos())
                poderDAO.Eliminar(poder);
            
            Persistencia.NH.NHibernateHelper.CerrarFabrica();
        }
        
    }
}